package com.ccut.xunfeiSpringboot.service.impl;

import com.ccut.xunfeiSpringboot.dto.ChatRequest;
import com.ccut.xunfeiSpringboot.entity.CalendarEvent;
import com.ccut.xunfeiSpringboot.mapper.CalendarEventMapper;
import com.ccut.xunfeiSpringboot.model.RoleContent;
import com.ccut.xunfeiSpringboot.service.BaseService;
import com.ccut.xunfeiSpringboot.service.CalendarEventService;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.SignatureException;
import java.util.ArrayList;
import java.util.List;

@Service
public class CalendarEventServiceImpl implements CalendarEventService {

    @Autowired
    private CalendarEventMapper calendarEventMapper;

    @Autowired
    private BaseService baseService;

    @Override
    public void addByAI(String data, Integer userId, HttpServletResponse response) throws IOException, SignatureException, InterruptedException {
        ChatRequest chatRequest = new ChatRequest();
        chatRequest.setUserId(Long.valueOf(userId));
        List<RoleContent> messages = new ArrayList<>();
        messages.add(new RoleContent("system", "你是一个精通时间规划的机器人，可以按照下面的信息给我规划和安排事件。"));
        String prompt = """
            请根据{data}信息，生成推荐的日程安排。每个事件需包含标题、开始时间、结束时间、描述信息，且任意两个事件之间的时间不能重叠。
            已有的事件如下：{events}
            
            ### 输出字段要求：
            - title: 事件标题
            - start: 开始时间（格式："2025-07-10 09:00"）
            - end: 结束时间（格式："2025-07-10 10:00"）
            - description: 事件描述
            
            ### 要求：
            1. 生成至少5个日程事件，表示与学习或者面试相关的活动（如面试、知识学习、简历优化等）。
            2. 所有事件之间的时间不能冲突，并且同一天中的两个相邻的事件至少隔30分钟，同一天安排的事件不能超过3个。
            3. 事件内容应结合用户的技能、经历和求职方向进行个性化推荐。
            4. 请以严格的 JSON 格式返回数据，仅输出 JSON 内容，不包含任何解释性文本。
            5. 要求安排的事件的开始时间要从明天开始，今天的日期是{date}。
            
            以下仅展示输出格式，内容不能与下述相同
            ### 示例输出格式：
            [
              {
                "title": "Java开发岗位线上面试",
                "start": "2025-07-10 10:00",
                "end": "2025-07-10 11:00",
                "description": "参与某互联网公司的Java开发工程师职位线上面试，建议提前复习Spring Boot与分布式系统相关知识。"
              },
              {
                "title": "算法刷题训练",
                "start": "2025-07-10 14:00",
                "end": "2025-07-10 16:00",
                "description": "针对ACM竞赛经验，继续提升算法能力，为技术岗笔试做准备。"
              },
              {
                "title": "产品经理职业分享会",
                "start": "2025-07-11 15:00",
                "end": "2025-07-11 17:00",
                "description": "了解产品岗工作内容及职业发展路径，适合有校园组织经历的同学参加。"
              }
            ]
            """;
        prompt = prompt.replace("{data}", data);
        prompt = prompt.replace("{date}", java.time.LocalDate.now().toString());
        prompt = prompt.replace("{events}", calendarEventMapper.getAll(userId).toString());
        messages.add(new RoleContent("user", prompt));
        chatRequest.setDeepThinking(false);
        chatRequest.setNetworkSearch(false);
        chatRequest.setQuestion("");
        chatRequest.setMessages(messages);
        // 设置响应类型为 application/json 并启用流式输出
        response.setContentType("application/json;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");

        ServletOutputStream outputStream = response.getOutputStream();
        baseService.arrangeEvents(chatRequest, content -> {
            try {
                if (content != null) {
                    outputStream.write(content.getBytes(StandardCharsets.UTF_8));
                    outputStream.flush();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
    }

    @Override
    public List<CalendarEvent> getAll(Integer userId) {
        return calendarEventMapper.getAll(userId);
    }

    @Override
    public void add(CalendarEvent calendarEvent) {
        calendarEventMapper.insert(calendarEvent);
    }
}
